/**
 * 
 */

package com.gustozzi.distribucion.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.gustozzi.distribucion.action.util.Constantes;
import com.gustozzi.distribucion.negocio.DistribucionBO;
import com.gustozzi.distribucion.negocio.impl.DistribucionBOImpl;
import com.gustozzi.domain.Devolucion;
import com.gustozzi.domain.Pedido;
import com.gustozzi.domain.Producto;
import com.gustozzi.domain.Usuario;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author FABRIZIO
 * 
 */
public class DevolucionAction extends ActionSupport implements ServletRequestAware
{
    private static final long serialVersionUID = 1L;
    DistribucionBO distribucionBO = new DistribucionBOImpl();
    private String botonSeleccionado;
    private Devolucion devolucion;
    private List<Devolucion> listaDevoluciones;
    private List<Pedido> listaPedidos;
    private List<Producto> listaTotalizados;
    private List<Producto> listaProductos;
    private String codigoSeleccionado;
    private ArrayList<String> listaSeleccionados;
    private HttpServletRequest request;
    private boolean indicadorListaVacia;

    public String execute()
    {
        String destino = Constantes.CADENA_VACIA;
        if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_FILTRAR))
        {
            destino = obtenerListaDevoluciones();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_REPORTE))
        {
            destino = null;
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_NUEVO))
        {
            destino = nuevaDevolucion();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_ELIMINAR))
        {
            destino = eliminarDevolucion();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_EDITAR))
        {
            destino = editarDevolucion();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_VERPEDIDO))
        {
            destino = verPedido();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_MOSTRARPRODUCTOS))
        {
            destino = mostrarProductos();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_CANCELAR))
        {
            destino = cancelarPedido();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_GUARDAR))
        {
            destino = guardarDevolucion();
        }
        else
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public String obtenerListaDevoluciones()
    {
        String destino = Constantes.CADENA_VACIA;
        List<Devolucion> lista = null;
        String codigoCentroDistribucion = Constantes.CADENA_VACIA;
        String codigoDevolucion = Constantes.CADENA_VACIA;
        try
        {
            codigoDevolucion = devolucion.getCodigo();
            codigoCentroDistribucion = devolucion.getCentroDistribucion().getCodigo();
            String fechaDesde = devolucion.getFechaDesde();
            String fechaHasta = devolucion.getFechaHasta();

            lista = new ArrayList<Devolucion>();
            lista = distribucionBO.obtenerListaDevoluciones(codigoDevolucion, codigoCentroDistribucion, fechaDesde,
                    fechaHasta);
            if (lista.size() == 0)
            {
                indicadorListaVacia = true;
            }
            this.setListaDevoluciones(lista);
            request.getSession().setAttribute(Constantes.LISTADEVOLUCIONSESSION, lista);
            request.getSession().setAttribute("listaDevolucionesCompletaSession", lista);
            destino = Constantes.CONSULTARDEVOLUCION;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public String nuevaDevolucion()
    {
        devolucion.setCodigo("TEMP");
        request.getSession().removeAttribute("listaPedidosSession");
        String destino = Constantes.NUEVADEVOLUCION;
        Map<String, Object> session = ActionContext.getContext().getSession();
        session.remove("codigoDevolucion");
        session.remove("codigoCentroDistribucion");
        return destino;
    }

    public String eliminarDevolucion()
    {
        String destino = Constantes.CADENA_VACIA;
        String respuesta;
        String codigoDevolucionEliminar = codigoSeleccionado;
        try
        {
            respuesta = distribucionBO.eliminarDevolucion(codigoDevolucionEliminar);

            if (respuesta.equalsIgnoreCase("OK"))
            {
                destino = Constantes.CONSULTARDEVOLUCION;
            }
            else
            {
                destino = Constantes.ERROR;
            }
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public String editarDevolucion()
    {
        String destino = Constantes.CADENA_VACIA;
        String centro = Constantes.CADENA_VACIA;
        String fechaDevolucion = Constantes.CADENA_VACIA;
        String fechaRegistro = Constantes.CADENA_VACIA;
        List<Pedido> lista = null;
        try
        {
            @SuppressWarnings("unchecked")
            List<Devolucion> listaDevoluciones = (ArrayList<Devolucion>) request.getSession().getAttribute(
                    Constantes.LISTADEVOLUCIONSESSION);

            for (int i = 0; i < listaDevoluciones.size(); i++)
            {
                Devolucion beanDevolucion = listaDevoluciones.get(i);
                if (codigoSeleccionado.equalsIgnoreCase(beanDevolucion.getCodigo()))
                {
                    centro = beanDevolucion.getCentroDistribucion().getCodigo();
                    fechaRegistro = beanDevolucion.getFechaRegistro();
                    fechaDevolucion = beanDevolucion.getFechaDevolucion();
                    break;
                }
            }

            lista = new ArrayList<Pedido>();
            lista = distribucionBO.obtenerListaPedidoXDevolucion(codigoSeleccionado);
            

            setListaPedidos(lista);
            calcularTotalizados(lista);
            request.getSession().removeAttribute("listaPedidosCompletaSession");
            request.getSession().removeAttribute("listaPedidosSession");
            request.getSession().setAttribute("listaPedidosSession", lista);
            
            this.setListaPedidos(lista);
            devolucion.setCodigo(codigoSeleccionado);
            devolucion.setFechaDevolucion(fechaDevolucion);
            devolucion.setFechaRegistro(fechaRegistro);
            
            Map<String, Object> session = ActionContext.getContext().getSession();
            session.put("codigoDevolucion", codigoSeleccionado);
            session.put("codigoCentroDistribucion", centro);
            
            destino = Constantes.NUEVADEVOLUCION;
        }
        catch (Exception e)
        {
            destino = "ERROR";
        }
        return destino;
    }

    public String verPedido()
    {
        String destino = Constantes.CADENA_VACIA;
        try
        {
            request.getSession().removeAttribute("ORIGENPEDIDO");
            request.getSession().setAttribute("ORIGENPEDIDO", "DEVOLUCION");
            destino = Constantes.VERPEDIDO;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    @SuppressWarnings("unchecked")
    public String mostrarProductos()
    {
        String destino = Constantes.CADENA_VACIA;
        List<Pedido> listaPedidos = null;
        List<Producto> listaProductosTotalizados = null;
        String codigoPedido = codigoSeleccionado;
        try
        {
            listaPedidos = (ArrayList<Pedido>) request.getSession().getAttribute("listaPedidosSession");
            listaProductosTotalizados = (ArrayList<Producto>) request.getSession().getAttribute(
                    "listaTotalizadosSession");
            for (int i = 0; i < listaPedidos.size(); i++)
            {
                Pedido pedido = listaPedidos.get(i);
                if (pedido.getCodigo().equalsIgnoreCase(codigoPedido))
                {
                    setListaProductos(pedido.getListaProductos());
                    break;
                }
            }
            setListaPedidos(listaPedidos);
            setListaTotalizados(listaProductosTotalizados);
            destino = Constantes.MOSTRARPRODUCTOS;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    @SuppressWarnings("unchecked")
    public String cancelarPedido()
    {
        String destino = "";
        List<Pedido> listaPedidos = null;
        String codigoPedido = codigoSeleccionado;
        try
        {
            listaPedidos = (ArrayList<Pedido>) request.getSession().getAttribute("listaPedidosSession");
            for (int i = 0; i < listaPedidos.size(); i++)
            {
                Pedido pedido = listaPedidos.get(i);
                if (pedido.getCodigo().equalsIgnoreCase(codigoPedido))
                {
                    listaPedidos.remove(i);
                    break;
                }
            }
            setListaPedidos(listaPedidos);
            request.getSession().setAttribute("listaPedidosSession", listaPedidos);
            destino = Constantes.LIBERARPEDIDO;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public String guardarDevolucion()
    {
        String destino = Constantes.CADENA_VACIA;
        String respuesta = Constantes.CADENA_VACIA;
        try
        {
            // String datosDevolucion = request.getParameter("fechaEntrega");
            // String[] datos = datosDevolucion.split(":");
            //
            // Usuario usuario = (Usuario)
            // request.getSession().getAttribute("usuarioSession");
            //
            // respuesta = distribucionBO.guardarDespacho(datos[1], datos[0],
            // usuario.getCodigo());
            //
            // if (respuesta.equalsIgnoreCase(Constantes.ERROR))
            // {
            // destino = Constantes.ERROR;
            // }
            // else
            // {
            destino = Constantes.CONSULTARDEVOLUCION;
            // }
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }
    
    public void calcularTotalizados(List<Pedido> listaPedidosSeleccionados)
    {
        List<Producto> listaTotalizadosArmada = null;
        List<Producto> listaProductosTotales = new ArrayList<Producto>();

        for (int n = 0; n < listaPedidosSeleccionados.size(); n++)
        {
            Pedido pedidoTotalizados = listaPedidosSeleccionados.get(n);
            List<Producto> listaProductosTotalizados = (ArrayList<Producto>) pedidoTotalizados.getListaProductos();
            listaProductosTotales.addAll(listaProductosTotalizados);
        }

        HashMap<String, List<Producto>> tablaProductos = new HashMap<String, List<Producto>>();
        List<Producto> listaProductosIguales = new ArrayList<Producto>();
        for (int p = 0; p < listaProductosTotales.size(); p++)
        {
            Producto prod = listaProductosTotales.get(p);
            if (p == 0)
            {
                listaProductosIguales.add(prod);
                tablaProductos.put(prod.getCodigo(), listaProductosIguales);
            }
            else
            {
                if (tablaProductos.containsKey(prod.getCodigo()))
                {
                    List<Producto> listaRetorno = (ArrayList<Producto>) tablaProductos.get(prod.getCodigo());
                    listaRetorno.add(prod);
                    tablaProductos.remove(prod.getCodigo());
                    tablaProductos.put(prod.getCodigo(), listaRetorno);
                }
                else
                {
                    listaProductosIguales = new ArrayList<Producto>();
                    listaProductosIguales.add(prod);
                    tablaProductos.put(prod.getCodigo(), listaProductosIguales);
                }
            }
        }

        Iterator<Entry<String, List<Producto>>> itr = tablaProductos.entrySet().iterator();
        listaTotalizadosArmada = new ArrayList<Producto>();
        while (itr.hasNext())
        {
            Entry<String, List<Producto>> list = itr.next();
            List<Producto> listaTotalProductos = (ArrayList<Producto>) list.getValue();
            Producto productoTotalizado = new Producto();
            int cantidadTotal = 0;
            double pesoTotal = 0;
            String nombre = "";
            for (int x = 0; x < listaTotalProductos.size(); x++)
            {
                Producto producto = (Producto) listaTotalProductos.get(x);
                cantidadTotal += producto.getCantidad();
                pesoTotal += producto.getPeso();
                nombre = producto.getDescripcion();
            }
            productoTotalizado.setCodigo(list.getKey());
            productoTotalizado.setCantidad(cantidadTotal);
            productoTotalizado.setPeso(pesoTotal * cantidadTotal);
            productoTotalizado.setNombre(nombre);
            productoTotalizado.setDescripcion(nombre);
            listaTotalizadosArmada.add(productoTotalizado);
            setListaTotalizados(listaTotalizadosArmada);
        }
        request.getSession().setAttribute("listaTotalizadosSession", listaTotalizadosArmada);
    }

    @Override
    public void setServletRequest(HttpServletRequest request)
    {
        this.request = request;
    }

    /**
     * @return the botonSeleccionado
     */
    public String getBotonSeleccionado()
    {
        return botonSeleccionado;
    }

    /**
     * @param botonSeleccionado
     *            the botonSeleccionado to set
     */
    public void setBotonSeleccionado(String botonSeleccionado)
    {
        this.botonSeleccionado = botonSeleccionado;
    }

    /**
     * @return the codigoSeleccionado
     */
    public String getCodigoSeleccionado()
    {
        return codigoSeleccionado;
    }

    /**
     * @param codigoSeleccionado
     *            the codigoSeleccionado to set
     */
    public void setCodigoSeleccionado(String codigoSeleccionado)
    {
        this.codigoSeleccionado = codigoSeleccionado;
    }

    /**
     * @return the listaPedidos
     */
    public List<Pedido> getListaPedidos()
    {
        return listaPedidos;
    }

    /**
     * @param listaPedidos
     *            the listaPedidos to set
     */
    public void setListaPedidos(List<Pedido> listaPedidos)
    {
        this.listaPedidos = listaPedidos;
    }

    /**
     * @return the listaTotalizados
     */
    public List<Producto> getListaTotalizados()
    {
        return listaTotalizados;
    }

    /**
     * @return the listaProductos
     */
    public List<Producto> getListaProductos()
    {
        return listaProductos;
    }

    /**
     * @param listaTotalizados
     *            the listaTotalizados to set
     */
    public void setListaTotalizados(List<Producto> listaTotalizados)
    {
        this.listaTotalizados = listaTotalizados;
    }

    /**
     * @param listaProductos
     *            the listaProductos to set
     */
    public void setListaProductos(List<Producto> listaProductos)
    {
        this.listaProductos = listaProductos;
    }

    /**
     * @return the listaSeleccionados
     */
    public ArrayList<String> getListaSeleccionados()
    {
        return listaSeleccionados;
    }

    /**
     * @param listaSeleccionados
     *            the listaSeleccionados to set
     */
    public void setListaSeleccionados(ArrayList<String> listaSeleccionados)
    {
        this.listaSeleccionados = listaSeleccionados;
    }

    /**
     * @return the indicadorListaVacia
     */
    public boolean isIndicadorListaVacia()
    {
        return indicadorListaVacia;
    }

    /**
     * @param indicadorListaVacia
     *            the indicadorListaVacia to set
     */
    public void setIndicadorListaVacia(boolean indicadorListaVacia)
    {
        this.indicadorListaVacia = indicadorListaVacia;
    }

    /**
     * @return the devolucion
     */
    public Devolucion getDevolucion()
    {
        return devolucion;
    }

    /**
     * @return the listaDevoluciones
     */
    public List<Devolucion> getListaDevoluciones()
    {
        return listaDevoluciones;
    }

    /**
     * @param devolucion
     *            the devolucion to set
     */
    public void setDevolucion(Devolucion devolucion)
    {
        this.devolucion = devolucion;
    }

    /**
     * @param listaDevoluciones
     *            the listaDevoluciones to set
     */
    public void setListaDevoluciones(List<Devolucion> listaDevoluciones)
    {
        this.listaDevoluciones = listaDevoluciones;
    }
}